﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LM.InterfacesFabricas.DTOs;
using LM.Tela.Desktop.Properties;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces;

namespace LM.Tela.Desktop.Formularios
{
    public partial class frmCadastroDeDependente : Form
    {
        public IList<DtoDependente> ListDependente { get; set; }
        public int RowIndex { get; set; }
            
        public frmCadastroDeDependente(String Clientenome)
        {
            InitializeComponent();
            ListDependente = new List<DtoDependente>();
            dpdCliente.Items.Add(Clientenome);
            dpdCliente.SelectedIndex = 0;
        }

        private void btnCancelar_Click( object sender, EventArgs e )
        {
            DialogResult result = MessageBox.Show(Resources.messageBox_dialog_exit, Resources.messageBox_title_Confirmação, MessageBoxButtons.YesNo, MessageBoxIcon.Information);
            if (result == DialogResult.Yes)
            {
                this.Close();
            } 
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            Salvar();
            CarregueItensJaCadastrados();
        }

        private void btnNovo_Click(object sender, EventArgs e)
        {
            PrepareTelaParaNovoRegistro();
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (!EmEdicao())
            {
                this.ExibaInconsistencia("Dependente não selecionada para edição.");
            }
            else
            {
                foreach (var c in ListDependente.Where(c => c.Codigo == int.Parse(txtCodigo.Text)))
                {
                    ListDependente.Remove(c);
                }

                PrepareTelaParaNovoRegistro();
                CarregueItensJaCadastrados();
            }
        }

        private void PrepareTelaParaNovoRegistro()
        {
            LimpeCamposEdicao();
            CarregueItensJaCadastrados();
            txtCodigo.Enabled = true;
            txtCodigo.Focus();
            dpdCliente.SelectedIndex = 0;
        }

        private bool EmEdicao()
        {
            return !string.IsNullOrWhiteSpace(txtCodigo.Text) && txtCodigo.Enabled == false;
        }

        private void CarregueItensJaCadastrados()
        {
            grdDependentes.DataSource = new List<DtoDependente>();
            grdDependentes.DataSource = ListDependente;
        }

        private void LimpeCamposEdicao()
        {
            txtCodigo.Text = string.Empty;
            txtNome.Text = string.Empty;
            txtCpf.Text = string.Empty;
            dpdCliente.SelectedIndex = 0;
            txtCnh.Text = string.Empty;
        }

        private void Salvar()
        {
            dpdCliente.SelectedIndex = 0;
            DtoDependente d = new DtoDependente();

            int codigo;
            int.TryParse(txtCodigo.Text, out codigo);
            var dependente = new DtoDependente
            {
                Nome = dpdCliente.Text,
                Codigo = codigo,
                Cnh = txtCnh.Text,
                Cpf = txtCpf.Text
            };

             var servicoDeDependente = FabricaGenerica.Crie<IServicoDeDepentente>();

             if (!EmEdicao())
             {
                 d = servicoDeDependente.Valide(dependente);
                 Cadastre(d);
             }
             else
                 Atualize(dependente);

            PrepareTelaParaNovoRegistro();
        }

        private void Cadastre(DtoDependente dependente)
        {
            ListDependente.Add(dependente);
        }

        private void Atualize(DtoDependente dependente)
        {
            ListDependente[RowIndex] = dependente;
        }

        private void grdDependentes_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            RowIndex = e.RowIndex;
            if (e.RowIndex >= 0)
            {
                var dependente = ((IList<DtoDependente>)grdDependentes.DataSource)[e.RowIndex];

                txtCodigo.Text = dependente.Codigo.ToString(CultureInfo.InvariantCulture);
                txtCodigo.Enabled = false;
                txtCnh.Text = dependente.Cnh;
                txtCpf.Text = dependente.Cpf;
                txtNome.Text = dependente.Nome;
            }
        }
    }
}
